/*
 * main.cpp
 *
 *  Created on: May 3, 2012
 *      Author: seba
 */

// EJEMPLO DE ARGUMENTOS -p 20 -v 1 -c 4 -t 60

#include "Dios.h"
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
#include <getopt.h>
#include <stdio.h>

#define VERSION "Proyecto 1 - 7550 Tecnicas de Programacion Concurrentes I - Version 1.0\n"

void imprime_uso() {
	printf(VERSION);
	printf(
			"Dios [OPTIONS]\n"
				"-h, --help \t Muestra esta ayuda y finaliza.\n"
				"-p, --pisos\t Cantidad de pisos en la simulacion.\tValor por Defecto: 10\n"
				"-v, --velocidad\t Velocidad en que se mueve el ascensor.\tValor por Defecto: 1\n"
				"-c, --capacidad\t Capacidad del ascensor en kgr.\t\tValor por Defecto: 250\n"
				"-t, --tiempo\t Tiempo de la simulacion.\t\tValor por Defecto: 30segundos\n"
				"-a, --ascensores\tCantidad de ascensores del edificio\t\tValor por Defecto: 3\n"
				"-d, --modo debug\t Activar el modo debug"
				"-l, --modo log\t Activar el modo log"
				"-s, --modo synchro\t Activar el modo synchro");
}

int main(int argc, char **argv) {

	int cantPisos = 10;
	int velocidad = 1;
	int capAsc = 250;
	int tiempo = 30;
	int cantAsc = 3;
	char c = 0;
	bool modoDebug=true;
	bool modoLog=true;
	bool modoSyn=true;

	bool modoCout = true;

	while ((c = getopt(argc, argv, "a:p:v:c:t:h:d:l:s")) != -1) {

		if (c == -1)
			break;

		switch (c) {

		case 'h':
			imprime_uso();
			exit(0);
			break;

		case 'p':
			cantPisos = atoi(optarg);
			break;

		case 'v':
			velocidad = atoi(optarg);
			break;

		case 'c':
			capAsc = atoi(optarg);
			break;

		case 't':
			tiempo = atoi(optarg);
			break;

		case 'a':
			cantAsc = atoi(optarg);
			break;

		case 'd':
			modoDebug = true;
			break;

		case 'l':
			modoLog   = true;
			break;

		case 's':
			modoSyn   = true;
			break;

		case '?':
			if (optopt == 'c' || optopt == 'v' || optopt == 't' || optopt == 'p' || optopt == 'a')
				fprintf(stderr, "Option -%c requires an argument.\n", optopt);
			else
				fprintf(stderr, "Error en los parámetros\n");
			exit(0);
			break;

		default:
			abort();
			break;
		}
	}

	Logger::getInstance()->setFlags(atoi(argv[5]), atoi(argv[6]), atoi(argv[7]),
			atoi(argv[8]));

	Dios *d = new Dios(cantPisos, velocidad, capAsc, tiempo, cantAsc, modoDebug, modoLog, modoSyn, modoCout);

	int status = d->start();

	delete(d);

	return status;

}
